Аккерман на О

$ rlwrap ./target/debug/console Welcome to O-CPS Interpreter v0.12.0! > f:{[x;y]$[0=x;1+y;$[0=y;f[x-1;1];f[x-1;f[x;y-1]]]]};f[3;6] 509 fn ackerman_k(b: &mut Bencher) { let mut i = Interpreter::new().unwrap(); let ack = i.parse(&"f:{[x;y]$[0=x;1+y;$[0=y;f[x-1;1];f[x-1;f[x;y-1]]]]}".to_string()); i.run(ack).unwrap(); let call = i.parse(&"f[3;4]".to_string()); b.iter(|| { i.run(call); }) } fn ack(m: isize, n: isize) -> isize { if m == 0 { n + 1 } else if n == 0 { ack(m - 1, 1) } else { ack(m - 1, ack(m, n - 1)) } } #[bench] fn ackerman_rust(b: &mut Bencher) { b.iter(|| { ack(3,4) }) } test ackerman_k ... bench: 77,385 ns/iter (+/- 18,011) test ackerman_rust ... bench: 12,483 ns/iter (+/- 7,698) $ cat ack.lua function ack(m,n) if m == 0 then return n + 1 else if n == 0 then return ack(m-1, 1) else return ack(m-1, ack(m, n-1)) end end end local x = os.clock() local f = 0 for i=0,1000000,1 do f = ack(3,4) end print(f,(os.clock()-x)*1000000) $ luajit ack.lua 125 40721830